package pers.wensheng.patterns.structural_pattern.proxy_pattern.CGLIB_dynamic_proxy;


import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 代理对象工厂
 *
 * 获取代理对象，也就是目标对象所处类的子类
 * 代理类就是 TrainStation 的子类
 */
public class ProxyFactory implements MethodInterceptor {

    private TrainStation station = new TrainStation();

    /**
     * 获取代理对象
     * @return
     */
    public TrainStation getProxyObject(){
        //1.创建Enhancer对象，类似于jdk代理中的proxy类
        Enhancer enhancer = new Enhancer();
        //2.设置父类的字节码对象，cglib的代理类是目标类的子类，代理类继承自该类
        enhancer.setSuperclass(TrainStation.class);
        //设置回调函数，我们调用代理对象执行方法的时候，到底执行那个方法呢
        //要 MethodInterceptor 的子实现类，代理对象执行那个方法
        enhancer.setCallback(this);
        //创建代理对象
        TrainStation station = (TrainStation) enhancer.create();
        return station;
    }

    /**
     * 通过代理对象调用 sell() 方法的时候会执行 intercept 这个方法
     * @param o             代理对象
     * @param method        对应调用的方法对象
     * @param objects       实际参数
     * @param methodProxy   代理对象中的方法的method实例
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        //调用目标对象的方法
        System.out.println("CGlib代理：方法运行前增强，收取一定的费用...");
        Object res = method.invoke(station, objects);
        System.out.println("CGlib代理：方法运行以后增强...");
        return res;
    }
}
